//
//  Vector3D.hpp
//  C3W_Demo_By_Fan
//
//  Created by 范静涛 on 2024/7/22.
//

//------------------------------------------------------------------------------
//【文件名】Vector3D.hpp
//【功能模块和目的】三维向量类模版定义及实现，用于存储T类型元素的三维度向量
//【开发者及日期】范静涛 2024/7/22
//【更改记录】
//------------------------------------------------------------------------------

#ifndef Vector3D_hpp
#define Vector3D_hpp

//size_t所属头文件
#include <cstddef>
//Vector基类模版所属头文件
#include "Vector.hpp"

//------------------------------------------------------------------------------
//【类模版名】Vector3D
//【功能】三维向量向量模版
//【接口说明】
//    继承了基类全部接口
//    默认构造函数
//    带参数构造函数
//    拷贝构造函数
//    赋值运算符overload
//    虚析构函数（可能做基类）
//    类派生接口：三维叉积函数实现，派生类根据需要重载(从概念出发，应存在的多态行为)
//【开发者及日期】 范静涛 2024/7/22
//【更改记录】
//------------------------------------------------------------------------------
template <class T>
class Vector3D : public Vector<T, 3>{
public:
    //--------------------------------------------------------------------------
    //必要的构造、析构、赋值行为
    //--------------------------------------------------------------------------
    //继承基类构造函数（不包括拷贝构造）
    using Vector<T, 3>::Vector;
    //拷贝构造函数
    Vector3D(const Vector3D& Source);
    //带基类参数的构造函数，用于基类对象向派生类对象的转换
    Vector3D(const Vector<T, 3>& Source);
    //赋值运算符overload
    Vector3D& operator=(const Vector3D& Source);
    //赋值运算符overload，用于基类对象向派生类对象的赋值
    Vector3D& operator=(const Vector<T, 3>& Source);
    //虚析构函数
    virtual ~Vector3D() = default;
protected:
    //三维向量叉积实现函数的override(返回值、函数名、参数列表，均与基类保持一致)
    Vector<T,3> Protected_CrossProduct(const Vector<T, 3>& AVector) 
        const override;
};

//------------------------------------------------------------------------------
//必要的构造、析构、赋值行为
//------------------------------------------------------------------------------

//函数名：Vector3D
//功能：拷贝构造函数，手动调用Vector<T, 3>(Source)初始化基类部分
//入口参数：const Vector3D<T>& Source
//出口参数：无
//返回值：无
template <class T>
Vector3D<T>::Vector3D(const Vector3D<T>& Source) : Vector<T, 3>(Source){
}

//函数名：Vector3D
//功能：带参构造函数，用于基类对象向派生类对象的转换
//     手动调用Vector<T, 3>(Source)初始化基类部分
//入口参数：const Vector<T, 3>& Source
//出口参数：无
//返回值：无
template <class T>
Vector3D<T>::Vector3D(const Vector<T, 3>& Source) : Vector<T, 3>(Source){
}

//函数名：operator=
//功能：赋值运算符overload，手动调用Vector<T, 3>赋值运算符，给基类部分赋值
//入口参数：const Vector3D<T>& Source
//出口参数：无
//返回值：三维向量自身的引用
template <class T>
Vector3D<T>& Vector3D<T>::operator=(const Vector3D<T>& Source){
    if (this != &Source) {
        Vector<T, 3>::operator=(Source);
    }
    return *this;
}

//函数名：operator=
//功能：赋值运算符overload，用于基类对象向派生类对象的转换
//     手动调用Vector<T, 3>(Source)初始化基类部分
//入口参数：const Vector<T, 3>& Source
//出口参数：无
//返回值：三维向量自身的引用
template <class T>
Vector3D<T>& Vector3D<T>::operator=(const Vector<T, 3>& Source){
    if (this != &Source) {
        Vector<T, 3>::operator=(Source);
    }
    return *this;
}

//函数名：Protected_CrossProduct const
//功能：三维向量叉乘实现override，用于基类对象向派生类对象的转换
//入口参数：const Vector<T, 3>& AVector
//出口参数：无
//返回值：结果Vector<T, 3>对象
template <class T>
Vector<T,3> Vector3D<T>::Protected_CrossProduct
 (const Vector<T, 3>& AVector) const{
    using Base = Vector<T,3>;
    std::array<T, 3> Res;
    Res[0] = Base::Components[1] * AVector.Components[2]
           - Base::Components[2] * AVector.Components[1];
    Res[1] = Base::Components[2] * AVector.Components[0]
           - Base::Components[0] * AVector.Components[2];
    Res[2] = Base::Components[0] * AVector.Components[1]
           - Base::Components[1] * AVector.Components[0];
    return Vector<T, 3>{Res};
};

#endif /* Vector3D_hpp */
